//
//  main.m
//  07-内存管理
//
//  Created by dllo on 16/7/12.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Man.h"
int main(int argc, const char * argv[]) {
   // 内存问题
   // 一,内存泄漏
   // 内存过多导致溢出,产生Crash
    // 二,野指针
    // 指针指向未知区域, 指向一块被释放的内存
    // 内存管理方式
    // 1.垃圾回收机制: 只有Mac上有
    // iOS
    // 2.MRC:手动管理引用计数
    // 3.ARC:自动管理引用计数(现在常用)
    // 注意:ARC基于MRC进行管理,系统帮程序员添加了内存管理的内容.
    // 遇到 retain,alloc,copy需要进行内存管理

    // 内存管理: 引用计数(计数器)
    // 有retain,alloc,copy会对引用计数 + 1
    // 有release,autoRelease 会对引用计数 - 1
    // 当对象的计数器为0的时候,系统会调用对应的的dealloc方法.
    // 注意:内存管理, 你对对象操作完成后,再进行释放
    Man *man = [[Man alloc] init];
    NSLog(@"%lu", man.retainCount);
    [man retain];
    [man release];
    NSLog(@"%lu", man.retainCount);
    // 集合类型,会对对象进行引用计数
    // addObject 对对象进行引用计数 + 1
    // removeObject 对 对象进行引用计数 - 1
//    NSMutableArray *array = [NSMutableArray arrayWithObjects:man, nil];
//    NSLog(@"向数组中添加后的引用计数 %lu", man.retainCount);
//   [array removeAllObjects];
//    NSLog(@"向数组中删除后的引用计数 %lu", man.retainCount);
    // 2.ARC
    // strong(强引用,引用计数 + 1) weak(应用于对象类型(NSObject子类),弱引用, 对象被释放时, 会自动置空)
    // retain(强引用,引用计数 + 1)
    // copy(拷贝,把对象拷贝一份, 原来的引用计数不变, 新的 + 1)
    // assgin(基本数据类型, 不会产生引用计数)
    
//    [man Tcopy];
    
    // 如果想实现对象的拷贝
    // 1.签订协议NScopying
    // 2.实现协议方法 copyWithZone
    Man *man1 = [man copy];
    NSLog(@"man : %@ man1 : %@",man, man1 );
    man1.name = @"xieWenJun";
    man1.sexual = @"double";
    // KVC Key-Value-Coding 键值编码 间接访问成员的方式
    // valueForKey
  id name = [man1 valueForKey:@"name"];
    NSLog(@"%@", name);
    [man1 release];
    Man *gayMan = [[Man alloc] init];
    gayMan.gayBoy = man1;
    
 id boyName  = [gayMan valueForKeyPath:@"gayBoy.name"];
    NSLog(@"------%@",boyName);
    [gayMan setValue:@"李四" forKeyPath:@"gayBoy.name"];
    NSLog(@"%@", gayMan.gayBoy.name);
      [gayMan release];
    
  // 如果在ARC工程下使用MRC的文件
    // -fno-objc-arc
    // 在MRC中要使用ARC的文件
    // -fobjc-arc
    // [man sayHello];
    
    return 0;
}
